// 原型式继承

/*

缺点： 包含引用类型的属性值始终都会共享相应的值， 这点跟原型链继承一样

*/


function CreateObj(o){
    function F(){}
    F.prototype = o;
    console.log(o.__proto__ === Object.prototype);
    console.log(F.prototype.constructor === Object); // true
    return new F();
}

var person = {
    name: 'xiaopao',
    friend: ['daisy','kelly']
}

var person1 = CreateObj(person);
var person2 = CreateObj(person);


console.log(person); // { name: 'xiaopao', friend: [ 'daisy', 'kelly' ] }
console.log(person1); // {}
console.log(person2); // {}

console.log(person.prototype, person.__proto__, person.constructor); // undefined {} [Function: Object]
console.log(person1.prototype, person1.__proto__, person1.constructor); // undefined { name: 'xiaopao', friend: [ 'daisy', 'kelly' ] } [Function: Object]
console.log(person1.__proto__ === person); // true

person1.name = 'person1';
console.log(person.name); // xiaopao
console.log(person1.name); // person1
console.log(person2.name); // xiaopao

person.name = 'person';
console.log(person.name); // person
console.log(person1.name); // person1
console.log(person2.name); // person

person1.friend.push('taylor');
console.log(person.friend); //  ["daisy", "kelly", "taylor"]
console.log(person1.friend); // ["daisy", "kelly", "taylor"]
console.log(person2.friend); // ["daisy", "kelly", "taylor"]


person1.friend = ['lulu'];
console.log(person.friend); //  ["daisy", "kelly", "taylor"]
console.log(person1.friend); // ['lulu']
console.log(person2.friend); // ["daisy", "kelly", "taylor"]

person.friend.push('mama');
console.log(person.friend); //  [ 'daisy', 'kelly', 'taylor', 'mama' ]
console.log(person1.friend); // [ 'lulu' ]
console.log(person2.friend); // [ 'daisy', 'kelly', 'taylor', 'mama' ]
// 注意： 这里修改了person1.name的值，person2.name的值并未改变，并不是因为person1和person2有独立的name值，而是person1.name='person1'是给person1添加了name值，并非修改了原型上的name值
// 因为我们找对象上的属性时，总是先找实例上对象，没有找到的话再去原型对象上的属性。实例对象和原型对象上如果有同名属性，总是先取实例对象上的值
